package com.iwuyc.tools.commons.structs.basic;

import java.io.Serializable;

/**
 * 用于存储键-值对的场景
 *
 * @param <K> key的实际类型
 * @param <V> val的实际类型
 */
public interface Pair<K, V> {
    /**
     * 获取key
     *
     * @return key的值
     */
    K getKey();

    /**
     * 获取值
     *
     * @return 值
     */
    V getVal();

    /**
     * 返回一个可序列化的键值对
     *
     * @param key 键
     * @param val 值
     * @param <K> 键的实际类型
     * @param <V> 值的实际类型
     * @return 可序列化的键值对
     */
    static <K extends Serializable, V extends Serializable> Pair<K, V> serializable(K key, V val) {
        return new SerializablePair<>(key, val);
    }

    /**
     * 创建一个不可序列化的键值对
     *
     * @param key 键
     * @param val 值
     * @param <K> 键的实际类型
     * @param <V> 值的实际类型
     * @return 不可序列化的键值对
     */
    static <K, V> Pair<K, V> unserializable(K key, V val) {
        return new UnserializablePair<>(key, val);
    }
}
